Немного оптимизировал текстурки, убрал альфаканал. В mdlvis качество ухудшилось не сильно, тестируй. На счет моделей, там итак анимаций почти нет, скелет резать негде ОО
Забыль
то что ты скинул это VJass. Короче нужен тебе JNGP, там же включить плагин UMS. Затем должен сохранить два раза. мб инфа пригодиться как использовать JNGP. По идее щас более новый JNGP и проблем не должно быть
вот карта
Пробовать не хочу, но предложу вот, что:
Если цель - защитить карту от подглядывания. То при старте игры или инициализации (если получится) можно запустить триггер с условием Вид: карта разведана is Set == да (процитировал текст условия из Гуи), действие - замкнутый цикл, или вызвать фатальную ошибку, вылет и т.д. Суть в том, что когда игрок запустит карту с такими параметрами, то тупо закрашить варик.
есть событие - юнит получает урон. в нём отслеживается как жертва, так и наносящий урон. можно хоть через хэш, хоть через структуру Юнита записывать всё, что угодно. Кто от кого конкретно сколько получил урона, кто кому сколько нанёс, сколько провисел на ком-то бафф яда и т.п. (Сначала был loop, а теперь периодический триггер). Каждые N секунд, перебираешь всех юнитов в массиве или списке, и отслеживаешь всё, что надо.
Структура - Unit. У неё есть двойной список с юнитами и уроном от яда (полученным или нанесённым - зависит от того, у кого будет этот список - у жертв или у тех, кто наносит яд). Типа DoubleList. В DoubleList есть элементы DoubleElement. В каждом таком элементе записаны unit и real (урон от яда от этого юнита). При получении урона от яда перебирается список, если юнит уже есть, урон от него (или ему) прибавляется. Если нет, то создаётся новый элемент с новым юнитом.
Периодически у нужных юнитов эти списки перебираются. Всё.
во первых: не надо дублировать вопросы
во вторых: у меня твоя карта открывается
правда я не настолько сумасшедший чтобы юзать вин10
в третьих: размер мапы большой и может тупо не хватать памяти (особенно если юзаешь вин10)
советую попробовать переустановить jngp
если не поможет то сменить винду
JNGP снимает ограничения (например максимум декорации 20к), если обычным редактором открыть критует. В jngp есть новые гуишные функции, которых нет в обычном, стандартный редактор их не распознает. Юзайте поиск, такой вопрос уже задавали
Просто , нужно тогда будет удалять старый плавающий текст с тем значением , либо там есть замена , ну если вообще не сможешь можешь кинуть мапу , сделаю быстренько .
После создания текста скрываешь его от всех.
Обращение идёт на группу игроков - все игроки.
Далее берёшь группу (новую, переменная) и заносишь в неё только тех игроков, которые должны увидеть этот текстаг.
Например через аналог "отряда" для юнитов - Группа игроков - действие...
Если выбранный игрок видит точку/юнита - то добавить его в группу
Далее - показать текст этой группе
В конце - очистить группу (удалить/затереть, если это локалка)
да я решыл проблему я просто перегрузил комп
Я понел в чом проблема я поставил в vjass 2 галки нижние включил из надо отключать и тогды проблем не будет
создать.
направить на 128 точек наверх(90)
сделать неперманентным
текст удалится через 3 секунды
текст затухнет до 100% прозрачности через 3 секунды
Вот чёрт. не успел приплюснуть к посту.
1 Попробуй через игровой интерфейс где "броня" поставить "Защита: |c00000000" Возможно цифра станет чёрной и следовательно невидимой.
2 Импортируй нестандартную модель времени, которая закрывает ту часть, что с бронёй, это сработает точно.
Проверил из интереса. нет 1 способ не канает, только слово защита затереть можно. Иконку можно поставить чёрную или прозрачную, оставив лишь циферку. Если всё-таки хочется скрыть всё - импортируй модель времени, например из карты Ded moroz battle
потому что чистить группы игроков - это уже изврат
запихивай нужных игроков в переменную и с ней работай, в конце действий - обнуляй
а так ты уже борщишь
и про опт стоит задумываться, если у тебя объем кода как в доте, к примеру. тогда да
иначе - какой смысл?
Нашёл систему, где звук передаётся в таймер, который истекает через 0 секунд. В результате один и тот же звук может проигрываться несколько раз без всяких проблем. В инетике пишут мол это такой баг движка.
Попробуй отключить триггеры, для начала, и затем проверь, запустится ли карта в игре. Особенно те, которые были созданы/редактированы относительно недавно до появления фатала.
Sergey105, проблема в способе хранения а не в вджасс
цикл бегает от 1 до count включительно
первый объект будет в 1 ячейке
второй во 2
третий в третьей
count равен 3
раз время везде 6 секунд то первой освободиться первая ячейка
count станет равен 2
и цикл будет обрабатывать ячейки 1(пустая) и 2
но объект в 3 ячейке всё ещё остался так как время для него не закончилось
а так как мы его не удалили а просто потеряли то и эффект и экземпляр структуры остаются
и того утечка памяти
вот статья которую можно юзать как пример
Функшн поинтеров помимо типа code в жассе нет. Можно полагаться только на ExecuteFunc, куда аргументы передаются только глобалками, соответственно никакого тайпчекинга.
Использовать можно например так
struct mystruct
static method mymethod takes nothing returns nothing
call BJDebugMsg("this works")
endmethod
endstruct
function myfunction takes nothing returns nothing
call ExecuteFunc(mystruct.mymethod.name) //ExecuteFunc compatibility
call OnAbilityCast('A000',mystruct.mymethod.name)
//for example, caster system's OnAbilityCast, requires a function name
endfunction
Эмм что за ерунда, сократил код, убрав всё лишнее, но утечки все равно остаются, по 1.5 - 2 хэндла за каждое нанесение урона (тип хэндла не знаю как посмотреть). Когда триггер отключаешь, то всё нормально.
Сокращенный код
function SDMSCreateTextTag takes nothing returns nothing
local unit u=GetTriggerUnit()
local unit s=GetEventDamageSource()
local integer i=GetConvertedPlayerId(GetOwningPlayer(u))
local texttag tt=CreateTextTag()
local real dmg=GetEventDamage()
if ( dmg > 1.00 ) and ( dmg < 9999.00 ) then
if GetPlayerId(GetOwningPlayer(u))==12 then
call SetTextTagText(tt, "|cff9db9eb-"+I2S(R2I(dmg))+"|r", 0.023)
else
call SetTextTagText(tt, "|cffffa500-"+I2S(R2I(dmg))+"|r", 0.023)
endif
call SetTextTagPosUnit(tt, u, 0)
call SetTextTagColor(tt, 255, 255, 255, 255)
call SetTextTagVelocity(tt, 0.05325*Cos(90 * bj_DEGTORAD), 0.05325*Sin(90 * bj_DEGTORAD))
call SetTextTagPermanent(tt, false)
call SetTextTagLifespan(tt, 1.0)
call SetTextTagFadepoint(tt, 0.0)
endif
call PolledWait(2.0)
call DestroyTextTag(tt)
set u=null
set s=null
set i=0
set dmg=0
set tt=null
endfunction
function SDMSTriggerRegisterUnitDamaged takes nothing returns nothing
call TriggerRegisterUnitEvent(udg_SDMStrigger,GetEnteringUnit(),EVENT_UNIT_DAMAGED)
endfunction
function theSDMSTriggerActions takes nothing returns nothing
local trigger UnitEnter=CreateTrigger()
call TriggerRegisterEnterRectSimple(UnitEnter, gg_rct_Arena)
call TriggerAddAction(UnitEnter,function SDMSTriggerRegisterUnitDamaged)
set UnitEnter=null
endfunction
function InitTrig_the_SDMS_Trigger takes nothing returns nothing
local trigger tr=CreateTrigger()
set udg_SDMStrigger=CreateTrigger()//Тут также меняется название глобальной переменной типа триггер.
call TriggerAddAction(udg_SDMStrigger,function SDMSCreateTextTag)
call TriggerRegisterTimerEventSingle(tr,0.0)
call TriggerAddAction(tr,function theSDMSTriggerActions)
set tr=null
endfunction
Wait вызывает утечки ((
Пришлось делать через таймер
выбираешь все юниты,деструктэйблы,итемы и сохраняеш в кэш а также сохраняешь их координаты,но в мультиплеере кэш нельзя сохранить на диск,так что если надо сохранять в мультиплеере то юзай прелоад а если не надо сохранять на диск то юзай структуры или хэш
Я удалял всеь код кроме етой системы все ефект тотже. также я писал что переносил наработку на иную мапу и там все работало. понятно что проблема не в коде..по тому как баг в том что рынок(юнит) меняет владельца, на красного скажем, еслиб не менял багаб небыло, но есть карта где он есть.. на разных мапах при абсолютно едентичных настройках юнитов, и коде(никакого второстепенного кода нет тока тот что в 1м посту)
опшем так я психанул и начал отрезать куски из мапы, сначала в 10 раз удалил весь код кроме наработки, затем удалил итемы, и вернул код и вот чудо баг пропал, =============================================================================
думаю проблема была в том что иды предметам я в ручную прописывал, там была своя закономерность, но увы теперь придется периписать все иды предметов, и заминить их в коде что очень ни удобно и моторно=(
Если во всех картах одинаковый id, значит покопайся в хеше.
Это как, можно в личку?
Проблему решил, переделав стандартную способность, а не создавая нестандартную. Это почти что панацея от подобных случаев, когда id (ещё называют raw-code) способности меняется.
nvc123, если честно мне его действия очень напоминают хитрое попрошайничество. Да и на сайте тем по типу - "Как посчитать количество предметов в области" уже штук 3-4 было. Да и я бы ему рекомендовал провернуть такой трюк сначала с одним предметом а потом понять принцип и склепать по аналогии еще сколько нужно раз. И не проще ли сделать 1 круг для все этих 10 предметов и рядом круг для жертвы?
"Далеко твоя рпг не уйдёт" моя рпг тебя переживет.
Ты тоже когда родился не умел так нагло хамить незнакомым людям, научился же как то. Люди с более серьезным отношением к миру чем "изменить систему один не могу но буду плакать об этом" могут изучить все что захотят и даже в одиночку будут стоить больше чем тысяча "всегда сдающихся" людей,
и тот человек (Да удалось, даже был лаунчер для этой игры. Forgotten Land) это подтвердил, хотя я уверен что он быстро опустил руки.
p.s чел прекращай настраивать других людей на поражение, если ты что-то можешь дать - дай, если хочешь чтобы другие не добились успеха чтобы ты оказался прав и не чувствовал себя ущербным то просто отойди в сторону.
Я на все твои выпады отвечу лишь одной фразой:
"Dota была обычной картой для warcraft 3 и она поначалу тоже была пустой ".
Ответы получены, пару шарящих людей нашел, (дай бог каждому такого человека который рассказал мне о многом что тут считают до сих пор невозможным)
Спасибо за поддержку! и особенно одному пользователю. Ведь именно благодаря таким людям как life2smiler, люди не делают хорошие проэкты а другие люди соответственно вынуждены играть в некачественные карты и в течении нескольких лет не находить решения наболевших проблем
(если нет хотя бы 1 го человека кому удалось сделать что-то необычное то все остальные продолжат считать это невозможным) А сегодня стало ясно что могут не знать о чем либо не только потому что никто не делал этого, а потому что человек на самом деле сделал но никому говорить не стал :)
короче лаунчер при запуске палит версию вара и посылает на нужный серв
все
по другому просто никак не может быть
а то, сколько серверов держит один проект - дело уже другое
и с одного пк можно запустить сколько угодно серверов, при наличии рук и ресурсов
Увы низя указывать рекурсии на взаимосвязи элементов или юнитов.
Если вы хотите отменять апгрейды зданий, делайте их кастомно к примеру на основе продажи\подготовки юнитов, только здание продало\построило определённого юнита сразу же изменть его на другое, попутно удалив подготовленного\проданного юнита.
Такой принцип используется в TD от близзард ''Лазурные башни".
Можно попробовать с помощью морфов сфинкса.
Maniac_91, фактически такая генерация и была придумана Нотчем для майнкрафта. Просто обычная система "биомов". Это кстати очень неплохо, ведь для каждого биома ты можешь подгружать свой пул декораций и так разнообразить визуальную составляющую игры.
Так же перед началом игры (после загрузки карты), можно сделать плашку "загрузки генерации", которая показывала бы пользователям % готовность генерации. А далее, таймерами или вейтами, выставлять "отдых" для варкрафта из-за нагрузки. Мол, каждые 1500 выполнений триггера - отдохни на секунду, хорош.
PT153, ну call просто вызываешь потоком (он не создает поток), например у тебя в ряд выставлены сверху вниз названия функции со скобочками (и внутри скобок аргументы, а если не берет никаких аргументов, то внутри скобок пусто) и через call вызывает одну за другой последовательно сверху вниз.
call название функции (аргументы)
Допустим первую верхнюю функцию вызвали, и ее обработали, потом поток берет вторую внизу функцию и обрабатывает и т.д. Но у потока есть ограничения в операциях, как только выполнится определенное количество операций, варкрафт экстренно завершает поток и даже не сообщает об этом.
call функция 1()
call функция 2()
......
call функция 999()
Тут хочу обратить внимание и на то, насколько длинный код в этой вызываемой функции. И сколько вызываемой работы потребует: всякие вычисления, бесконечные циклы и другое. Если длинный код у тебя, и кучу циклов, и сами циклы большую работу совершают, то следует разбить на участки или как-то переделать что ли, уменьшить работу цикла и др.
Можно разбить на функции и ...
вызывать через call, но так делать не стоит. Поток вызывает эти функции последовательно.
Нужно делать задержку (через вэйт), например в ИИ-скриптах варкрафта делают задержку, чтобы не было нагрузки. Вместо вэйта можно таймер.
через ExecuteFunc, ExecuteFunc создает отдельный новый поток. информацию про ExecuteFunc скидывал выше.
vLAd333, с помощью сайта конвертировал в какой формат?
посмотрел карту
блин я же просил проверить пути к текстурам
мало того что везде war3mapImported которого быть не должно
так ещё и модель требует разрезать картинку на 4 части
короче читаем статьи про создание лоадскринов и импорт файлов в карту
Есть, триггер для триггерных скиллов 1, 3 ивента, кастанул, завершил каст, выучил - все, далее условие что абилка в базе данных и собственно действие екзикут функции взятой из базы данных.
Alexander69, xgm.guru/p/wc3/optimisations
внимательно прочти то что там написано
особенно про переменные
если коротко то объект не может быть удалён из памяти пока используется (хранится в переменных/хэше/кэше)
Кстати да, тоже интересно. Всегда просто удаляю второй. Я понимаю, что там скорее всего что-то несет информационную ценность, но оно бы тогда хотя бы настраивалось как-то в оптимизаторе, создавать его или не создавать и/или удалить после выполнения оптимизации, а то немного раздражает мусор руками чистить. Если такие настройки есть - подскажите плз.
Нужно скопировать это в нестандартный код карты (или как то так) выше всех триггеров в гуях такое окно есть, куда можно писать текст...
Но нужно потом эти функции использовать, что возможно только на jass (а еще вам JNGP потребуется ибо там код на cjass)
Sacar777, выведи после MultiboardGetItem(udg_JC_Board, i-1, 1)
на экран следующий текст
I2S(GetHandleId(q1))
I2S(GetHandleId(q2))
если q2 по каким то причинам не создаётся то это скажет об этом
стоп
а какой у тебя размер столбца стоит?
мб просто ячейка q1 перекрывает собой ячейку q2
и размер 10 это очень много
ведь в отличие от гуи тут размер в сотых указывается
то есть если в гуи размер 10 то тут должен быть 0.1
поставь в MultiboardSetItemWidth(q1, 10.00)
вместо 10.00 0.1 и проверь
если 0.1 не сработает то поставь 0.02
если и это не сработает то отпиши сюда
я тогда раскапаю свой старый мультибоард и сравню с твоим
bOrissko, у тебя вроде как ссылалось всегда на Паладина, так как он Hero [1], будь-то владелец юнита, либо реплика от юнита. Точно уже запамятовал, так как шустро всё переделал. У меня нет желания тратить время на проверку триггера, когда указан Tiggering unit/Переключающий юнит, потому стараюсь всегда указывать точно к ситуации, в данном случае переделал так, что диалог срабатывает при приближении героя на расстояние не более 256 к капитану. Указал везде Entering unit/Не знаю как будет в русских триггерах, наверное, Вошедший или Входящий юнит. Вместо паузы для героя поставил приказ Стоп, хотя это, наверное, неправильно я сделал, так как он погонится во время диалога за приблизившимися врагами. Пожалуй, лучше верни герою паузу вместо Стоп, а также добавь неуязвимость до распаузы.
По поводу диалогов, мне рассказал автор кампании Эфирия, в создании которой участвую, что оптимальной длительностью диалогов является 5 секунд на строчку, если строка не полная, то прикидываешь, на сколько из 5 секунд она тянет. В самой первой фразе в диалоге лучше прибавлять секунду, так как мозг не сразу переключается с игры на диалог, и его начальная реплика зачастую кажется быстрой. Например, у тебя первая фраза "Привет!", это одна секунда, но так как она первая, то я поставил две. Следующая фраза тянет на 4 секунды, так и поставил.
Чтобы прикинуть расстояние до юнита, необходимо пользоваться сеткой:
Сетка в редакторе (кнопка G):
большой квадрат = 512х512
средний квадрат = 128х128
малый квадрат = 32х32
Считается расстояние от центра юнита, а не крайних точек модели. У тебя было 150, но мне показалось, что это мало, ведь подходить надо очень близко, потому поставил 256.
Частично не понял, тоесть нужно что бы в кинематике был несуществующий юнит?
Допустим в окне кинематики паладин с каким либо именем что то говорит, но на карте его нет. Если да то это Спецэффекты - Transmission From Unit-Type
А касательно остальной части, если UnitUserData нигде не используется, создаешь массив юнитов и отрядов. Массив юнитов забиваешь своими капитанами. В UnitUserData капитана пихаешь его порядковый номер в массиве. Создаешь группу юнитов для этого капитана.
Добавление через каст способности.
Я бы делал через 2 разные абилки с одной и той же позицией в интерфейсе. Пока нужный тебе юнит не является частью отряда - у него таргетная абилка при касте которой на капитана он добавляется в группу соответствующего капитана и получает 2ю абилку взамен первой.
Касательно выделения этих пехотинцев - можно намутить что-то с передачей контроля или создать триггер, который будет снимать выделение с юнитов у которых есть 2я абилка. Если ты хочешь чтобы по одиночке можно было выделять пехотинцев - можешь создать переменную для каждого игрока с капитанами, куда будет просто записываться последний выбранный юнит. При снятии выделения - проверять не выбран ли этот же юнит, в случае чего не снимать выделение. Правда не уверен будет ли корректно работать :> В крайнем случае - будет работать в три клика вместо двух. Если я не ошибаюсь.
Касательно поведения этих пехотинцев - что-то реально стоящее сделать сложно. Возможно, но мне не с руки все расписывать :> Простейший вариант - приказывать пехотинцам после добавления в группу следовать за капитаном.
Добавление через атаку капитана
Триггер, проверяющий что капитан получил урон или атакован, как угодно. Далее любым способом проверяешь есть ли в группе этого капитана юниты. Если нет - выбираешь всех пехотинцев N радиусе, добавляешь в отряд, заменяешь абилку/либо просто приказываешь кастануть в капитана первую абилку.
Есть проверка IsUnitDead, где проверяется тип и состояние IsUnitType(u, UNIT_TYPE_DEAD) но никогда не было проблем с проверкой хп.
Так же насколько я помню GetWidgetLife( unit ) > 0.0 или GetUnitState( unit, UNIT_STATE_LIFE ) > 0.405.
Ты не юнитов лучше считай, а просто маркируй башню при атаке её крипами... на 5-10 сек
И пока есть маркер - её можно атаковать кому угодно
Если маркера нет - то никому нельзя, только крипам (юнитам игрока-компа)
» WarCraft 3 / Модели из dota 2?
» WarCraft 3 / ИИ
» WarCraft 3 / Сделать позиционный звук
» WarCraft 3 / Не открывается карта
» WarCraft 3 / Как заменить текстуры рельефа?
» WarCraft 3 / Как сделать плавающий текст?
» WarCraft 3 / Что делать
» WarCraft 3 / как заказать модель?
» WarCraft 3 / TEXTTAG
» WarCraft 3 / Как показать изображение
» WarCraft 3 / Баг с анимацией.
» WarCraft 3 / Fatal error при запуске карты.
» WarCraft 3 / Модель/Текстура неба
» WarCraft 3 / Крашит карту
» WarCraft 3 / vJass начало
» WarCraft 3 / 7-ой тип атаки
» WarCraft 3 / Как удалить все предметы на карте?
» WarCraft 3 / Хост бот
» WarCraft 3 / Рекурсия
» WarCraft 3 / Текст на фоновом экране
» WarCraft 3 / Оптимизация
» WarCraft 3 / Мультиборд и jass
» WarCraft 3 / ОТРЯДЫ
» WarCraft 3 / Проблемы с ИИ
» WarCraft 3 / Атака в радиусе